Mysql + Grafana 监控爬虫程序

在使用爬虫爬取大量数据的时候,一般我们都会把程序挂在服务器上运行,然后就可以去干别的事情了。但是,我们还是有必要定时看一下程序运行情况的。虽然我们可以通过 log 信息来监控程序运行情况,但这往往不够直观。所以,今天我就讲讲如何使用 Mysql 和 Grafana 监控爬虫程序的运行状况,并可视化


1. Grafana 简介

Grafana 是一个数据可视化工具,它并不收集数据,但是可以从数据源(例如 Graphite、Mysql、InfluxDB等)中获取数据并可视化。


2. 运行 Grafana

Grafana 安装教程可以去网上搜,不多说。这里说的是另一种替代方法:使用已经安装好 Grafana 的 Docker 镜像(效果也是一样的)。如果不了解 Docker 的话,可以看下教程 Docker — 从入门到实践

在这里,我们需要先安装好 Docker,并学会一些 Docker 基本命令,例如拉取镜像,容器的创建,容器的运行停止,镜像和容器的删除等等。

安装并运行 Docker 之后:

  1. Docker hub 搜索一下包含 Grafana 的镜像,还是出现挺多个的。这里我选择了 kamon/grafana_graphite

  2. 在服务器上拉取镜像

docker pull kamon/grafana_graphite
  1. 使用该镜像创建容器,并在后台运行
docker run \
  -d \
  -p 80:80 \
  -p 81:81 \
  -p 2003:2003 \
  -p 8125:8125/udp\
  -p 8126:8126\
  --name=grafana_graphite \
  kamon/grafana_graphite 

到这里,我们就得到了一个已经安装了 Grafana 的容器,根本就不用我们手动安装了O(∩_∩)O 哈哈~

  1. 在浏览器中打开 http://your_server_ip:80/,登录(初始用户名和密码都是 admin),我们就可以看到 Grafana 的控制台了,还是挺酷炫的!


3. 编写爬虫程序并运行

略。(在这里,要将爬取到的 item 储存起来,例如插入 mysql 数据库)


4. 编写监控的脚本并运行

这里,我们要每隔一定时间查询爬取总量,并计算爬取速度。下面是一个例子:
代码分为两部分,首先是在我们存放 item 的数据库建立两个表,每个表有两个字段,一个是查询时间,另一个是 item_total / item_min

import pymysql as mdb
import time

# 存放爬取数据的数据库(这里我把统计的数据,存入了爬取数据所在的数据库)
DB_NAME = 'db_name'
TABLE_NAME1 = 'item_per_min'
TABLE_NAME2 = 'item_total'
host = 'your_server_ip'
user = 'your_user_name'
passwd = 'your_pwd'

# 爬取的 item 存放的表
item_table = 'item_table'

def create_table():
    use_db_str = 'use ' + DB_NAME
    create_table_str1 = "CREATE TABLE if not exists " + TABLE_NAME1 + """(
      `time` datetime NOT NULL,
      `speed` int NOT NULL DEFAULT '0'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"""

    create_table_str2 = "CREATE TABLE if not exists " + TABLE_NAME2 + """(
        `time` datetime NOT NULL,
        `total` int NOT NULL DEFAULT '0'   
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"""

    # 数据库连接
    conn = mdb.connect(host, user, passwd)
    cursor = conn.cursor()
    try:
        cursor.execute(use_db_str)
        cursor.execute(create_table_str1)
        cursor.execute(create_table_str2)
        conn.commit()
    except Exception as e:
        print(e)

代码第二部分是主函数,每隔一分钟查询 items 数,并计算爬取速度,将得到的数据储存起来:

if __name__ == '__main__':
    # 创建表
    create_table()
    conn = mdb.connect(host, user, passwd, DB_NAME)
    cursor = conn.cursor()

    before_item = 0
    while True:
        try:
            cursor.execute('SELECT count(*) FROM %s', item_table )
            result = cursor.fetchone()
            current_item = result[0]
            print(current_item)

            # 过去一分钟爬取量
            cursor.execute('insert into %s values (now(), %s)' % (TABLE_NAME1, current_item - before_item))
            # 爬取总量
            cursor.execute('insert into %s values (now(), %s)' % (TABLE_NAME2, current_item))

            conn.commit()
            before_item = current_item
        except Exception as e:
            print(e)

        time.sleep(60)

监控脚本写完后,就可以挂在服务器后台运行了


5. Grafana 配置

  1. 配置数据源,这里命名为 monitor_crawler


  1. 新建 Dashboard,然后点击 Graph 图标创建图,接着点击 Panel Title -> Edit


  1. 选择我们刚才创建的数据源 monitor_crawler


  1. 按照 Grafana 提供的模板填写 sql 语句,这里查询了 item_per_min
SELECT
  UNIX_TIMESTAMP(time) as time_sec,
  speed as value,
  'items_min' as metric
FROM item_per_min

(注意我们选择的是 Time series


  1. 可以选择绘图模式,一般是选 Lines


6. 成果展示

(其实 Grafana 还有很多很酷炫的设置,大家有兴趣可以去探索一下!)

总结

在安装好各种环境之后,Mysql + Grafana 监控爬虫程序的步骤:

  1. 编写爬虫程序
  2. 编写监控脚本,将爬取速度和爬取总量定时存进 Mysql 数据库
  3. Grafana 新建数据源,连接对应的 Mysql 数据库
  4. 创建新的 Dashboard,并在里面创建图表,图表数据源选择我们上一步新建的数据源
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容